#ifndef _DEP_H_
#define _DEP_H_
#include <iostream>
#include <ctime>
#include <windows.h>
#include "alphabet.h"
//最大化窗口
void maxmize();
//获取光标位置
COORD get_pos();
//设置光标位置
void set_pos(const COORD &pos);
//随机打点形式输出点阵：sin为点阵字符串数组（数据结构可以参考alphabet.h里的），h为点阵的行数，de为相邻两个点出来的时间间隔（单位为ms）
void pnt(const std::string *sin,int h,int de);
//随机打点形式输出英文单词或句子的点阵形式s为要输出的单词或句子（只能有大小(小写将被转换为大写)写和空格），de为相邻两个点出来的时间间隔（单位为ms），sp1字母的间距，sp2为单词的间距
void pnt_s(std::string s,int de,int sp1,int sp2);


//下面是定义
void maxmize()
{
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd,SW_MAXIMIZE);
}
COORD get_pos()
{
    CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
    COORD pos;
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hOut,&csbiInfo);
    pos.X=csbiInfo.dwCursorPosition.X,pos.Y=csbiInfo.dwCursorPosition.Y;
    return pos;
}
void set_pos(const COORD &pos)
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut,pos);
}

void pnt(const std::string *sin,int h,int de)
{
    using namespace std;
    int max=0,i,j,num=0;//num用来数已经打了几个点
    COORD pos_new,pos_old=get_pos();//获取光标初始坐标
    string s[(const int)h];
    for(i=0;i<h;++i)s[i]=sin[i];//复制sin的一个副本s
    for(i=0;i<h;++i)if(max<s[i].length())max=s[i].length();//得到最宽的行宽max
    for(i=0;i<h;++i)
        for(j=s[i].length();j<max;++j)s[i]+=" ";//将副本用空格补成矩形
    bool **mark = new bool*[h];//创建一个mark数组用于标记是否打过点，mark[i][j]标识的坐标为(j,i)
    for(i=0;i<h;++i){
        mark[i] = new bool[max];
        memset(mark[i],true,max*sizeof(bool));
    }//初始化mark为true
    srand((unsigned)time(NULL));//初始化随机数
    while(num<h*max){
        i=rand() % h;
        j=rand() % max;
        if(mark[i][j]){//打过了就重新取
            mark[i][j] = false;
            ++num;
            if(s[i][j]!=' '){//空格没什么好打的
                pos_new.X=pos_old.X+j;pos_new.Y=pos_old.Y+i;
                set_pos(pos_new);//移动光标到对应位置，pos_old.X为初始横坐标，pos_old.Y为初始纵坐标
                cout << s[i][j];//打点
                Sleep(de);//延迟
            }
        }
    }
    pos_new.X=pos_old.X+max;pos_new.Y=pos_old.Y+h;
    set_pos(pos_new);//移动光标到末尾
    for(i=0;i<h;++i){
        delete[] mark[i];
    }
    delete[] mark;//释放mark的内存
}
void pnt_s(std::string s,int de,int sp1,int sp2)
{
    using namespace std;
    COORD pos;
    int i;
    for(i=0;i<s.length();++i){
        if(s[i]>='a'&&s[i]<='z')s[i]-=32;//处理小写
        if(' '==s[i]){//处理空格
            pos = get_pos();
            pos.X+=sp2;
            set_pos(pos);
        }
        else if('\n'==s[i])cout << endl;//处理换行符
        else if(s[i]>='A'&&s[i]<='Z'){//处理大写
            pnt(alphabet[s[i]-'A'],5,de);//输出字符
            pos = get_pos();
            pos.X += sp1;
            pos.Y -= 5;
            if(i<s.length()-1)
                if('\n'==s[i+1]){//处理换行前的最后一个字符（就不打空格了）
                    pos.X -= sp1;
                    pos.Y += 5;
                }   
            if(s.length()-1==i){//处理最后一个字符（就不打空格了）
                pos.X -= sp1;
                pos.Y += 5;
            }
            set_pos(pos);
        }
    }
}
#endif